package datastu

import (
	"fmt"
	"reflect"
)

//map
func MapStu() {

	//创建一个map
	mp := make(map[string]int, 2)

	//创建赋值
	mp2 := map[string]float32{"aa": 1.3, "bb": 2}
	fmt.Printf("mp2: %#v\n", mp2)

	//赋值
	mp["s"] = 1
	fmt.Printf("mp: %v\n", mp)

	//单纯取值
	vv := mp2["aa"]
	fmt.Println(vv)

	//取值的同时可以判断是否已存在key
	v, ok := mp2["cc"]
	if ok {
		fmt.Println("cc is ", v)
	} else {
		fmt.Println("未赋值 ", v)
	}

	//循环  同java中的hashmap,map是无序的..
	for k, v2 := range mp2 {
		fmt.Println(k, v2)
		//v2++ //同切片一样这样不能修改原始map
		mp2[k]++

	}
	fmt.Println(mp2)

	//删除 不存在的建不会报错
	delete(mp2, "aa")
	fmt.Println(mp2)

	//map传入方法可以修改原始对象的值
	myPut(mp, "aaaa", 222)
	fmt.Println(mp)

}

func myPut(m map[string]int, k string, v int) {
	m[k] = v
}

//切片  切边本质是一个视图
func SliceStu() {
	//定义长度为0的切片
	var s1 []string
	//定义并赋值初始化
	s2 := []int{1, 2, 3, 4}

	//分开多行最后一个逗号是必须的...
	s22 := []string{
		"hello",
		"word",
	}

	//通过make创建
	s3 := make([]float32, 6)
	//通过make创建 指定  len cap(append扩容参数按cap的倍数)
	s4 := make([]int, 3, 10)

	//new 创建的是一个指针
	s5 := new([]int)
	*s5 = append(*s5, 5, 6, 7)
	fmt.Println("s5的类型是: ", reflect.TypeOf(s5), "\n指向的值是", *s5, "\ns5长度:", len(*s5),
		"\n===========================================")

	//s4[3] = 6 //依然会异常
	fmt.Printf("s4 is %v, 长度 %v, 容量%v \n", s4, len(s4), cap(s4))
	s4 = append(s4, 6)
	fmt.Printf("扩容1次 s4 is %v, 长度 %v, 容量%v \n", s4, len(s4), cap(s4))
	for i := 0; i < 10; i++ {
		s4 = append(s4, 6)
	}
	fmt.Printf("扩容2次 s4 is %v, 长度 %v, 容量%v \n", s4, len(s4), cap(s4))

	//添加数据
	s1 = append(s1, "a", "b", "e")
	fmt.Println(s1)

	//可以range往里面加元素...
	for i, v := range s2 {
		s2 = append(s2, v+i)
	}

	//[1 2 3 4 1 3 5 7]
	fmt.Println(s2)

	s3[1] = 0.2
	//s3[7] = 0.1 // runtime error: index out of range [7] with length 6
	fmt.Println(s3, "\n===========================================")

	//copy
	//截取[s,e)
	dst := make([]int, 6)
	//dest := make([]int, 1) //设置len小的话不会报错就只拷贝对应长度的数据进去 [3]
	copy(dst, s2[5:]) //[3 5 7 0 0 0]
	//copy(dst, s2[:2])  //再次调用会从下标0开始覆盖 [1 2 7 0 0 0] 7就没覆盖到
	fmt.Println(dst)

	fmt.Printf("%#v\n", s22) //[]string{"hello", "word"}

	//切片传入方法不能改变原始对象值
	rs := []int{1, 2, 3}
	adds(rs, 5)
	fmt.Println(">>>>>", rs)

	////数组传入方法不能改变原始对象值
	rr := [2]int{1, 2}
	adds2(rr, 5)
	fmt.Println("===", rr)

}

func adds2(rr [2]int, i int) {
	rr[0] = i
	fmt.Println("......", rr)
}

func adds(rs []int, i int) {
	rs = append(rs, i)
	fmt.Println("####", rs)
}
